package dao;


import java.util.List;

import hibernate.HibernateUtil;

import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;

import entity.Cliente.Entity_Cliente;
import entity.Cliente.Entity_CuentaCorriente;
import entity.Cliente.Entity_DireccionEntrega;
import entity.Cliente.Entity_FacturaCliente;
import entity.Cliente.Entity_ProductoCliente;
import entity.Cliente.Entity_ReciboPago;


public class ClienteDAO {
	private static ClienteDAO instancia;
	private static SessionFactory sf = null;

	private ClienteDAO() {
		sf = HibernateUtil.getSessionFactory();
    }
	
	
	public static ClienteDAO getInstancia(){
		if(instancia == null){
			instancia = new ClienteDAO();
		} 
		return instancia;
	}
		
	/**Cliente**/
	public void altaCliente(Entity_Cliente cliente) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(cliente); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta cliente");
	        }
	}
	public void modificarCliente(Entity_Cliente cliente) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(cliente); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar cliente");
	        }
	}
	public void bajaCliente(Entity_Cliente cliente) {
		try {
			 Session session=sf.getCurrentSession();
             session.beginTransaction();
             session.delete(cliente);
             session.flush();
             session.getTransaction().commit();
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error ClienteAO. Eliminar cliente");
        }
	}
	public Entity_Cliente getCliente(Integer idCliente) {
		try {
        	Session session=sf.openSession();
            session.beginTransaction();
            Entity_Cliente cliente = (Entity_Cliente) session.get(Entity_Cliente.class, idCliente);
            session.getTransaction().commit();
            session.close();
            return cliente;
        } catch (Exception e){
            System.out.println(e);
            System.out.println("Error ClienteAO. Get cliente");
        }
        return null;
	}
	
	
	/**Cuenta Corriente**/
	public void altaCuentaCorriente(Entity_CuentaCorriente cuentaCorriente) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(cuentaCorriente); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta Cuenta Corriente");
	        }
	}
	public void modificarCuentaCorriente(Entity_CuentaCorriente cuentaCorriente) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(cuentaCorriente); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar Cuenta Corriente");
	        }
	}
	public void bajaCuentaCorriente(Entity_CuentaCorriente cuentaCorriente) {
		try {
			 Session session=sf.getCurrentSession();
            session.beginTransaction();
            session.delete(cuentaCorriente);
            session.flush();
            session.getTransaction().commit();
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error ClienteAO. Eliminar Cuenta Corriente");
       }
	}
	public Entity_CuentaCorriente getCuentaCorriente(Integer idCuentaCorriente) {
		try {
       	Session session=sf.openSession();
           session.beginTransaction();
           Entity_CuentaCorriente cuentaCorriente = (Entity_CuentaCorriente) session.get(Entity_CuentaCorriente.class, idCuentaCorriente);
           session.getTransaction().commit();
           session.close();
           return cuentaCorriente;
       } catch (Exception e){
           System.out.println(e);
           System.out.println("Error ClienteAO. Get Cuenta Corriente");
       }
       return null;
	}
	/**Factura Cliente**/
	public Integer altaFacturaCliente(Entity_FacturaCliente factura) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            Integer id = (Integer) session.save(factura); 
	            session.getTransaction().commit();
	            session.close();
	            return id;
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta factura cliente");
	        }
		 return null;
	}
	public void modificarFacturaCliente(Entity_FacturaCliente factura) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(factura); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar factura cliente");
	        }
	}
	public void bajaFacturaCliente(Entity_FacturaCliente factura) {
		try {
			 Session session=sf.getCurrentSession();
           session.beginTransaction();
           session.delete(factura);
           session.flush();
           session.getTransaction().commit();
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error ClienteAO. Eliminar factura cliente");
      }
	}
	public Entity_FacturaCliente getFacturaCliente(Integer idFacturaCliente) {
		try {
      	Session session=sf.openSession();
          session.beginTransaction();
          Entity_FacturaCliente factura = (Entity_FacturaCliente) session.get(Entity_FacturaCliente.class, idFacturaCliente);
          session.getTransaction().commit();
          session.close();
          return factura;
      } catch (Exception e){
          System.out.println(e);
          System.out.println("Error ClienteAO. Get factura cliente");
      }
      return null;
	}
	/**Recibo Pago**/
	public Integer altaReciboPago(Entity_ReciboPago recibo) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            Integer id = (Integer) session.save(recibo); 
	            session.getTransaction().commit();
	            session.close();
	            return id;
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta Recibo Pago");
	        }
		 return null;
	}
	public void modificarReciboPago(Entity_ReciboPago recibo) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(recibo); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar Recibo Pago");
	        }
	}
	public void bajaReciboPago(Entity_ReciboPago recibo) {
		try {
			 Session session=sf.getCurrentSession();
          session.beginTransaction();
          session.delete(recibo);
          session.flush();
          session.getTransaction().commit();
     } catch (Exception e){
         System.out.println(e);
         System.out.println("Error ClienteAO. Eliminar Recibo Pago");
     }
	}
	public Entity_ReciboPago getReciboPago(Integer idReciboPago) {
		try {
     	Session session=sf.openSession();
         session.beginTransaction();
         Entity_ReciboPago recibo = (Entity_ReciboPago) session.get(Entity_ReciboPago.class, idReciboPago);
         session.getTransaction().commit();
         session.close();
         return recibo;
     } catch (Exception e){
         System.out.println(e);
         System.out.println("Error ClienteAO. Get Recibo Pago");
     }
     return null;
	}
	
	/**Direccion Entrega**/
	public void altaDireccionEntrega(Entity_DireccionEntrega recibo) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(recibo); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta Direccion Entrega");
	        }
	}
	public void modificarDireccionEntrega(Entity_DireccionEntrega recibo) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(recibo); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar Direccion Entrega");
	        }
	}
	public void bajaDireccionEntrega(Entity_DireccionEntrega recibo) {
		try {
			 Session session=sf.getCurrentSession();
          session.beginTransaction();
          session.delete(recibo);
          session.flush();
          session.getTransaction().commit();
     } catch (Exception e){
    	 System.out.println(e);
         System.out.println("Error ClienteAO. Eliminar Direccion Entrega");
     }
	}
	public Entity_DireccionEntrega getDireccionEntrega(Integer idDireccionEntrega) {
		try {
     	Session session=sf.openSession();
         session.beginTransaction();
         Entity_DireccionEntrega recibo = (Entity_DireccionEntrega) session.get(Entity_DireccionEntrega.class, idDireccionEntrega);
         session.getTransaction().commit();
         session.close();
         return recibo;
     } catch (Exception e){
         System.out.println(e);
         System.out.println("Error ClienteAO. Get Direccion Entrega");
     }
     return null;
	}
	/**Producto Cliente**/
	public void altaProductoCliente(Entity_ProductoCliente producto) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.save(producto); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Alta Producto Cliente");
	        }
	}
	public void modificarProductoCliente(Entity_ProductoCliente producto) {
		 try {
	        	Session session=sf.openSession();
	            session.beginTransaction();
	            session.update(producto); 
	            session.getTransaction().commit();
	            session.close();
	        } catch (Exception e){
	            System.out.println(e);
	            System.out.println("Error ClienteAO. Modificar Producto Cliente");
	        }
	}
	public void bajaProductoCliente(Entity_ProductoCliente producto) {
		try {
			 Session session=sf.getCurrentSession();
          session.beginTransaction();
          session.delete(producto);
          session.flush();
          session.getTransaction().commit();
     } catch (Exception e){
         System.out.println(e);
         System.out.println("Error ClienteAO. Eliminar Producto Cliente");
     }
	}
	public Entity_ProductoCliente getProductoCliente(Integer idProductoCliente) {
		try {
     	Session session=sf.openSession();
         session.beginTransaction();
         Entity_ProductoCliente producto = (Entity_ProductoCliente) session.get(Entity_ProductoCliente.class, idProductoCliente);
         session.getTransaction().commit();
         session.close();
         return producto;
     } catch (Exception e){
         System.out.println(e);
         System.out.println("Error ClienteAO. Get Producto Cliente");
     }
     return null;
	}
	
	
	/**Listados**/
	//Clientes
	@SuppressWarnings("unchecked")
	public List<Entity_Cliente> listarClientes(){
		try{
	        Session session = sf.openSession();
	        List<Entity_Cliente> lista = session.createQuery("from Entity_Cliente").list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar clientes");
	   }
	   return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Entity_FacturaCliente> listarFacturasClientePendientes(){
		try{
	        Session session = sf.openSession();
	        List<Entity_FacturaCliente> lista = session.createQuery("select f from Entity_FacturaCliente f where f.pagado = false").list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar facturas clientes");
	   }
	   return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Entity_FacturaCliente> listarFacturasClientePendientes(Integer idCliente){
		try{
	        Session session = sf.openSession();
	        List<Entity_FacturaCliente> lista = session.createQuery("select f from Entity_FacturaCliente f join f.cuentacorriente cc join cc.cliente cliente where f.pagado = false and cc.cliente.id = :id").setParameter("id", idCliente).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar facturas clientes pendientes por cliente");
	   }
	   return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_FacturaCliente> listarFacturasCliente(Integer idCliente){
		try{
	        Session session = sf.openSession();
	        List<Entity_FacturaCliente> lista = session.createQuery("select f from Entity_FacturaCliente f join f.cuentacorriente cc where cc.cliente.id = :id").setParameter("id", idCliente).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar facturas por clientes");
	   }
	   return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_ReciboPago> listarRecibos(){
		try{
	        Session session = sf.openSession();
	        List<Entity_ReciboPago> lista = session.createQuery("select r from Entity_FacturaCliente f join f.cuentacorriente cc join cc.recibos r ").list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar recibos");
	   }
	   return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_ReciboPago> listarRecibos(Integer idCliente){
		try{
	        Session session = sf.openSession();
	        List<Entity_ReciboPago> lista = session.createQuery("select r from Entity_FacturaCliente f join f.cuentacorriente cc join cc.recibos r  where cc.cliente.id = :id").setParameter("id", idCliente).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar recibos por clientes");
	   }
	   return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_DireccionEntrega> listarDireccionEntrega(Integer idCliente){
		try{
	        Session session = sf.openSession();
	        List<Entity_DireccionEntrega> lista = session.createQuery("select d from Entity_Cliente c join c.direccionesEntrega d  where c.cliente.id = :id").setParameter("id", idCliente).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar direcciones de entrega por clientes");
	   }
	   return null;
	}
	@SuppressWarnings("unchecked")
	public List<Entity_ProductoCliente> listarProductoCliente(Integer idCliente){
		try{
	        Session session = sf.openSession();
	        List<Entity_ProductoCliente> lista = session.createQuery("select p from Entity_Cliente c join c.productos p  where c.cliente.id = :id").setParameter("id", idCliente).list();
	    	session.close();
	        return lista;
		}catch(Exception e){
	        System.out.println(e);
	        System.out.println("ErrorDAO: AdministracionDAO: Listar productos cliente por clientes");
	   }
	   return null;
	}

}